package br.com.agregador.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@SequenceGenerator(name="oferta_seq", sequenceName="oferta_seq", allocationSize=1)
public class Oferta implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="oferta_seq")
	private Long id;
	
	@Column(nullable=false,columnDefinition="bigint")
	private Long idOferta;
	
	@Column(nullable=false,columnDefinition="varchar(100)")
	private String endereco;
	
	@Column(nullable=false,columnDefinition="varchar(50)")
	private String titulo;
	
	@Column(nullable=false,columnDefinition="varchar(500)")
	private String descricao;
	
	@Column(nullable=false,columnDefinition="float")
	private Float precoDe;
	
	@Column(nullable=false,columnDefinition="float")
	private Float precoPor;
	
	@Column(nullable=false,columnDefinition="float")
	private Float desconto;
	
	@Column(nullable=false,columnDefinition="varchar(500)")
	private String linkImage;
	
	@Column(nullable=false,columnDefinition="varchar(500)")
	private String linkOferta;
	
	@Column(nullable=false)
	@Temporal(TemporalType.DATE)
	private Date dataInicio;
	
	@Column(nullable=false)
	@Temporal(TemporalType.DATE)
	private Date dataFimPublicacao;
	
	@Column(nullable=false)
	@Temporal(TemporalType.DATE)
	private Date dataFim;
	
	@Column(nullable=false,columnDefinition="boolean")	
	private Boolean ativo;
	
	@ManyToOne(fetch=FetchType.LAZY, targetEntity=Categoria.class)
	@JoinColumn(name="categoria_id",referencedColumnName="id",nullable=false,insertable=true,updatable=true)
	private Categoria categoria;
	
	@ManyToOne(fetch=FetchType.LAZY, targetEntity=Parceiro.class)
	@JoinColumn(name="pareceiro_id",referencedColumnName="id",nullable=false,insertable=true,updatable=true)
	private Parceiro parceiro;
	
	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="oferta_cidade", 
			   joinColumns=@JoinColumn(name="oferta_id"),
			   inverseJoinColumns=@JoinColumn(name="cidade_id"))
	private List<Cidade> cidades = new ArrayList<Cidade>();
	
	@OneToMany(mappedBy="oferta", fetch=FetchType.LAZY, targetEntity=Click.class)
	private List<Click> clicks = new ArrayList<Click>();
	
	public Oferta(){		
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Long getIdOferta() {
		return idOferta;
	}

	public void setIdOferta(Long idOferta) {
		this.idOferta = idOferta;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Float getPrecoDe() {
		return precoDe;
	}

	public void setPrecoDe(Float precoDe) {
		this.precoDe = precoDe;
	}

	public Float getPrecoPor() {
		return precoPor;
	}

	public void setPrecoPor(Float precoPor) {
		this.precoPor = precoPor;
	}

	public Float getDesconto() {
		return desconto;
	}

	public void setDesconto(Float desconto) {
		this.desconto = desconto;
	}

	public String getLinkImage() {
		return linkImage;
	}

	public void setLinkImage(String linkImage) {
		this.linkImage = linkImage;
	}

	public String getLinkOferta() {
		return linkOferta;
	}

	public void setLinkOferta(String linkOferta) {
		this.linkOferta = linkOferta;
	}

	public Date getDataInicio() {
		return dataInicio;
	}

	public void setDataInicio(Date dataInicio) {
		this.dataInicio = dataInicio;
	}

	public Date getDataFim() {
		return dataFim;
	}

	public void setDataFim(Date dataFim) {
		this.dataFim = dataFim;
	}

	public Boolean getAtivo() {
		return ativo;
	}

	public void setAtivo(Boolean ativo) {
		this.ativo = ativo;
	}
	
	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	
	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}
	
	public List<Cidade> getCidades() {
		return cidades;
	}

	public void setCidades(List<Cidade> cidades) {
		this.cidades = cidades;
	}
	
	public Parceiro getParceiro() {
		return parceiro;
	}

	public void setParceiro(Parceiro parceiro) {
		this.parceiro = parceiro;
	}	
	
	public List<Click> getClicks() {
		return clicks;
	}

	public void setClicks(List<Click> clicks) {
		this.clicks = clicks;
	}
	
	public Date getDataFimPublicacao() {
		return dataFimPublicacao;
	}

	public void setDataFimPublicacao(Date dataFimPublicacao) {
		this.dataFimPublicacao = dataFimPublicacao;
	}	

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result
				+ ((idOferta == null) ? 0 : idOferta.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Oferta other = (Oferta) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (idOferta == null) {
			if (other.idOferta != null)
				return false;
		} else if (!idOferta.equals(other.idOferta))
			return false;
		return true;
	}		
}
